package utils

import (
	"fmt"
	"ginblog/config"
	"ginblog/model"
	_ "github.com/go-sql-driver/mysql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

// Db 声明一个数据据连接引擎
var Db *gorm.DB
var err error

func init() {
	dns := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
		config.DbUser, config.DbPassWord, config.DbHost, config.DbPort, config.DbName,
	)
	// 生成数据库连接引擎
	Db, err = gorm.Open(mysql.Open(dns), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			// gorm默认生成的表名为复数形式的
			SingularTable: true,
		},
	})

	if err != nil {
		fmt.Println("数据库连接失败:", err)
	}
	fmt.Println("数据库连接成功")

	// 可以同时创建多张表
	err := Db.AutoMigrate(&model.User{}, &model.Category{}, model.Article{}, model.Comment{}, model.Profile{})
	if err != nil {
		fmt.Println("创建失败", err)
	}

	sqlDB, _ := Db.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(10 * time.Second)

}
